﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CMPPProtocol.Message
{
    /// <summary>
    /// SP 向 ISMG 提交短信（CMPP_SUBMIT）操作（SP->ISMG）。
    /// </summary>
    public class CMPP_SUBMIT : ICMPP_MESSAGE,ICloneable
    {
        #region 字段

        #region 消息头
        /// <summary>
        /// 消息头（所有消息公共包头）。
        /// </summary>
        public CMPP_HEAD Head { get;  set; }
        #endregion

        #region 消息体
        /// <summary>
        /// 信息标识（由ISMG生成，发送时不填，供ISMG传输时使用，可以从返回的RESP中获得本次发送的MSG_ID，通过 HEAD 中的 SequenceID 字段对应）。
        /// </summary>
        public ulong MsgID { get; internal set; }
        /// <summary>
        /// 相同 Msg_Id 的信息总条数，从 1 开始。
        /// </summary>
        internal byte PkTotal = 1;
        /// <summary>
        /// 相同 Msg_Id 的信息序号，从 1 开始。
        /// </summary>
        internal byte PkNumber = 1;
        /// <summary>
        /// 相同 Msg_Id 的信息序号
        /// </summary>
        internal uint PkSequence;
        /// <summary>
        /// 是否要求返回状态确认报告（0：不需要；1：需要）。
        /// </summary>
        public byte RegisteredDelivery { get; set; }
        /// <summary>
        /// 信息级别。
        /// </summary>
        public byte MsgLevel { get; set; }
        /// <summary>
        /// 业务标识，是数字、字母和符号的组合（长度为 10，SP的业务类型，数字、字母和符号的组合，由SP自定，如图片传情可定为TPCQ，股票查询可定义为11）。
        /// </summary>
        public string ServiceID { get; set; }
        /// <summary>
        /// 计费用户类型字段（0：对目的终端MSISDN计费；1：对源终端MSISDN计费；2：对SP计费；3：表示本字段无效，对谁计费参见Fee_terminal_Id字段）。
        /// </summary>
        public byte FeeUserType { get; set; }
        /// <summary>
        /// 被计费用户的号码，当Fee_UserType为3时该值有效，当Fee_UserType为0、1、2时该值无意义。
        /// </summary>
        public string FeeTerminalID { get; set; }
        /// <summary>
        /// 被计费用户的号码类型，0：真实号码；1：伪码。
        /// </summary>
        internal byte FeeTerminalType;
        /// <summary>
        /// GSM协议类型（详细解释请参考GSM03.40中的9.2.3.9）。
        /// </summary>
        internal byte TPPID;
        /// <summary>
        /// GSM协议类型（详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位，右对齐）。
        /// </summary>
        internal byte TPUdhi;
        /// <summary>
        /// 信息格式（0：ASCII串；3：短信写卡操作；4：二进制信息；8：UCS2编码；15：含GB汉字）。
        /// </summary>
        public byte MsgFmt { get; set; }
        /// <summary>
        /// 信息内容来源（SP_Id：SP的企业代码：网络中SP地址和身份的标识、地址翻译、计费、结算等均以企业代码为依据。企业代码以数字表示，共6位，从“9XY000”至“9XY999”，其中“XY”为各移动公司代码）。
        /// </summary>
        public string MsgSrc { get; set; }
        /// <summary>
        /// 资费类别（01：对“计费用户号码”免费；02：对“计费用户号码”按条计信息费；03：对“计费用户号码”按包月收取信息费）。
        /// </summary>
        public string FeeType { get; set; }
        /// <summary>
        /// 资费代码（以分为单位）。
        /// </summary>
        public string FeeCode { get; set; }
        /// <summary>
        /// 存活有效期，格式遵循SMPP3.3协议。
        /// </summary>
        public string ValidTime { get; set; }
        /// <summary>
        /// 定时发送时间，格式遵循SMPP3.3协议。
        /// </summary>
        public string AtTime { get; set; }
        /// <summary>
        /// 源号码（SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段，该号码最终在用户手机上显示为短消息的主叫号码）。
        /// </summary>
        public string SrcID { get; set; }
        /// <summary>
        /// 接收信息的用户数量（小于100个用户）。
        /// </summary>
        public byte DestUsrTl
        {
            get
            {
                return (byte)DestTerminalID.Length;
            }
        }
        /// <summary>
        /// 接收短信的MSISDN号码。
        /// </summary>
        public string[] DestTerminalID { get; set; }
        /// <summary>
        /// 接收短信的用户的号码类型(0：真实号码；1：伪码）。
        /// </summary>
        internal byte DestTerminalType;
        /// <summary>
        /// 信息长度（Msg_Fmt值为0时：&lt; 160个字节；其它 &gt;= 140个字节)，取值大于或等于0。
        /// </summary>
        public byte MsgLength
        {
            get
            {
                return (byte)Convert.ToBytes(this.MsgContent, (CMPPEncoding)this.MsgFmt).Length;
            }
        }
        /// <summary>
        /// 信息内容。
        /// </summary>
        public string MsgContent { get; set; }
        /// <summary>
        /// 点播业务使用的LinkID，非点播类业务的MT流程不使用该字段。
        /// </summary>
        public string LinkID { get; set; }
        #endregion

        #endregion

        #region 公有方法

        /// <summary>
        /// 
        /// </summary>
        public override string ToString()
        {
            return MsgContent;
        }
        #endregion

        #region ICloneable 成员

        public object Clone()
        {
            return this.MemberwiseClone();
        }

        #endregion
    }
}
